/**
 * swjoy.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
package com.chongyuan.consumer.server;

import java.util.ArrayList;
import java.util.Date;

import org.springframework.stereotype.Service;

import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON;
import com.chongyuan.consumer.common.RedisConstant;
import com.chongyuan.consumer.dao.DeviceGpsMsgDao;
import com.chongyuan.consumer.pojo.DeviceGpsMsg;
import com.chongyuan.consumer.util.RedisUtil;
import com.icafebutler.framework.service.CrudService;
import com.icafebutler.framework.util.StringUtil;

/**
 * 
 * @author taof.feng
 * @version $Id: DeviceGpsMsgService.java, v 0.1 2018年4月13日 下午5:46:56 taof.feng
 *          Exp $
 */
@Service
public class DeviceGpsMsgService extends CrudService<DeviceGpsMsg, DeviceGpsMsgDao> {

	public void handleGpsMsg(String gpsMsg) {
		if (StringUtil.isBlank(gpsMsg)) {
			return;
		}

		String[] msgArray = gpsMsg.split(",");
		analysisGpsMsg(msgArray);
	}

	private void analysisGpsMsg(String[] msgArray) {
		DeviceGpsMsg deviceGpsMsg = madeDeviceGpsMsgHead(msgArray);
		String baseStationCnt = msgArray[17];// 基站数量

		// 处理基站信息
		madeBaseStationMsg(deviceGpsMsg, msgArray);

		int wifiIndex = (Integer.parseInt(baseStationCnt) + 1) * 3;
		if (msgArray.length <= 17 + wifiIndex + 1) {
			System.out.println("无wifi信息");
		} else {
			int wifiCnt = Integer.parseInt(msgArray[17 + wifiIndex + 1]);
			if (wifiCnt >= 1) {
				deviceGpsMsg.setWifi1Name(msgArray[19 + wifiIndex]);
				deviceGpsMsg.setWifi1Mac(msgArray[20 + wifiIndex]);
				deviceGpsMsg.setWifi1Signal(msgArray[21 + wifiIndex]);
			}
			if (wifiCnt >= 2) {
				deviceGpsMsg.setWifi2Name(msgArray[22 + wifiIndex]);
				deviceGpsMsg.setWifi2Mac(msgArray[23 + wifiIndex]);
				deviceGpsMsg.setWifi2Signal(msgArray[24 + wifiIndex]);
			}
			if (wifiCnt >= 3) {
				deviceGpsMsg.setWifi3Name(msgArray[25 + wifiIndex]);
				deviceGpsMsg.setWifi3Mac(msgArray[26 + wifiIndex]);
				deviceGpsMsg.setWifi3Signal(msgArray[27 + wifiIndex]);
			}
		}

		deviceGpsMsg.setAddTime(new Date());
		setGpsMsgToRedis(deviceGpsMsg);
		this.dao.save(deviceGpsMsg);
	}

	private DeviceGpsMsg madeDeviceGpsMsgHead(String[] msgArray) {
		DeviceGpsMsg deviceGpsMsg = new DeviceGpsMsg();
		// 信息头：厂商标识*设备ID*流水号*内容长度*内容标志
		String[] headMsgArray = msgArray[0].split("\\*");
		String firm = headMsgArray[0];// 厂商标识
		deviceGpsMsg.setFirm(firm);
		String deviceId = headMsgArray[1];// 设备ID
		deviceGpsMsg.setDeviceId(deviceId);
		String serialNo = headMsgArray[2];// 流水号
		deviceGpsMsg.setSerialNo(serialNo);
		String contentLength = headMsgArray[3];// 内容长度
		deviceGpsMsg.setContentLength(contentLength);
		String contentSign = headMsgArray[4];// 内容标志
		deviceGpsMsg.setContentSign(contentSign);
		// 信息内容
		String date = msgArray[1];// 日期
		deviceGpsMsg.setDate(date);
		String time = msgArray[2];// 时间
		deviceGpsMsg.setTime(time);
		String isLocation = msgArray[3];// 是否定位（A:定位，V:未定位）
		deviceGpsMsg.setIsLocation(isLocation);
		String lat = msgArray[4];// 纬度
		deviceGpsMsg.setLat(lat);
		String latIdentifier = msgArray[5];// 纬度标识
		deviceGpsMsg.setLatIdentifier(latIdentifier);
		String lon = msgArray[6];// 经度
		deviceGpsMsg.setLon(lon);
		String lonIdentifier = msgArray[7];// 经度标识
		deviceGpsMsg.setLonIdentifier(lonIdentifier);
		String speed = msgArray[8];// 速度
		deviceGpsMsg.setSpeed(speed);
		String direction = msgArray[9];// 方向
		deviceGpsMsg.setDirection(direction);
		String altitude = msgArray[10];// 海拔
		deviceGpsMsg.setAltitude(altitude);
		String satelliteCnt = msgArray[11];// 卫星个数
		deviceGpsMsg.setSatelliteCnt(satelliteCnt);
		String gsmSignal = msgArray[12];// GSM信号强度
		deviceGpsMsg.setGsmSignal(gsmSignal);
		String electricity = msgArray[13];// 电量
		deviceGpsMsg.setElectricity(electricity);
		String steps = msgArray[14];// 步数
		deviceGpsMsg.setSteps(steps);
		String rollCnt = msgArray[15];// 翻滚次数
		deviceGpsMsg.setRollCnt(rollCnt);
		String state = msgArray[16];// 设备状态
		deviceGpsMsg.setState(state);

		return deviceGpsMsg;
	}

	private DeviceGpsMsg madeBaseStationMsg(DeviceGpsMsg deviceGpsMsg, String[] msgArray) {
		int baseStationCnt = Integer.parseInt(msgArray[17]);// 基站数量
		// 处理基站信息
		if (baseStationCnt > 0) {
			String connectionBaseStation = msgArray[18];// 连接基站
			String mccNationalCode = msgArray[19];// mcc国家码
			String mccNetNum = msgArray[20];// mcc网号
			deviceGpsMsg.setConnectionBasesTation(connectionBaseStation);
			deviceGpsMsg.setMccNationalCode(mccNationalCode);
			deviceGpsMsg.setMccNetNum(mccNetNum);
			for (int i = 0; i < baseStationCnt; i++) {
				if (i == 0) {
					deviceGpsMsg.setAreaCode1(msgArray[21]);// 基站区域码1
					deviceGpsMsg.setBaseStationNo1(msgArray[22]);// 基站编号1
					deviceGpsMsg.setSignalIntensity1(msgArray[23]);// 信号强度1
				} else if (i == 1) {
					deviceGpsMsg.setAreaCode2(msgArray[24]);// 基站区域码2
					deviceGpsMsg.setBaseStationNo2(msgArray[25]);// 基站编号2
					deviceGpsMsg.setSignalIntensity2(msgArray[26]);// 信号强度2
				} else if (i == 2) {
					deviceGpsMsg.setAreaCode2(msgArray[27]);// 基站区域码3
					deviceGpsMsg.setBaseStationNo2(msgArray[28]);// 基站编号3
					deviceGpsMsg.setSignalIntensity2(msgArray[29]);// 信号强度3
				}
			}
		}
		return deviceGpsMsg;
	}

	/**
	 * 将设备定位的点放进redis，app直接访问redis去取
	 * 
	 * @param deviceGpsMsg
	 */
	private void setGpsMsgToRedis(DeviceGpsMsg deviceGpsMsg) {
		String dogIsRun = RedisUtil.getString(RedisConstant.DEVICE_DOG_IS_RUN + deviceGpsMsg.getDeviceId());
		if (StringUtil.isBlank(dogIsRun) || "false".equals(dogIsRun)) {
			return;
		}

		String listStrJson = RedisUtil.getString(RedisConstant.DEVICE_GPS_MSG_LIST + deviceGpsMsg.getDeviceId());
		if (StringUtil.isBlank(listStrJson)) {
			ArrayList<DeviceGpsMsg> list = new ArrayList<DeviceGpsMsg>();
			list.add(deviceGpsMsg);
			RedisUtil.setObject(RedisConstant.DEVICE_GPS_MSG_LIST + deviceGpsMsg.getDeviceId(), JSON.toJSONString(list), 60 * 60);
		} else {
			ArrayList<DeviceGpsMsg> list = new ArrayList<DeviceGpsMsg>();
			list = (ArrayList<DeviceGpsMsg>) JSON.parseArray(listStrJson, DeviceGpsMsg.class);
			list.add(deviceGpsMsg);
			RedisUtil.setObject(RedisConstant.DEVICE_GPS_MSG_LIST + deviceGpsMsg.getDeviceId(), JSON.toJSONString(list), 60 * 60);
		}
	}
}
